CloudFront FunctionsでIP制限を試してみた
こんにちは!コンサル部のinomaso(@inomasosan)です。
CloudFrontで検証期間中はIP制限したい場合ってありますよね。
今回はCloudFront Functionsで単純なIP制限くらいならできるという噂を聞いたので試してみました。
この記事で学べること
- CloudFront Functions作成方法
- IP制限のJavaScriptサンプルコード
前提知識
CloudFront Functionsとは
CloudFrontのエッジロケーションで、軽量なJavaScriptを高速かつ安価に実行できるサービスです。
詳細については弊社ブログにまとまっているので、こちらをご参照ください。
CloudFrontのIP制限おさらい
CloudFrontにはセキュリティグループがないため、CloudFront Functions以外だと以下の方法で対応する必要があります。
- CloudFrontにAWS WAFを紐付け、特定IPの許可ルール作成
- Lambda@EdgeによるIP制限
- X-Fowarded-forヘッダーによるアクセス制御
設定方法等については、以下リンク先が参考になるかと思います。
公式ドキュメント確認
CloudFront Functions作成方法は、公式ドキュメントのチュートリアルがありますので、最初にざっと読むのが良いです。
また、コードの記述方法は以下に記載されています。
コード例はありますが、残念なことにIP制限は無かったので、他の例を参考に書くことにしました。
やりたいことのイメージ
以下、AWS News Blogから抜粋した図です。 ※Introducing CloudFront Functions – Run Your Code at the Edge with Low Latency at Any Scale | AWS News Blog
CloudFront Functionsでやりたいことは、許可するIPからのリクエストだった場合はオリジン側へリクエストを渡し、それ以外の場合はクライアントにHTTPSステータスコード403でレスポンスを返すことです。
やってみる
1. 前提
今回はCloudFront+ALB+EC2が構築済みの環境を使用します。
2. CloudFront Functions設定
CloudFrontのサービス画面を開き、FunctionsからCreate functionボタンをクリックします。
任意の関数名を入力し、Continueボタンをクリックします。
BuildタブのDevelopmentタブにあるコードエディターに、下記サンプルコードを貼り付けた後はIP_WHITE_LIST
のアクセス許可するIPを書き換え、Saveボタンをクリックします。
function handler(event) { var request = event.request; var clientIP = event.viewer.ip; // アクセス許可するIPを設定 var IP_WHITE_LIST = [ 'xxx.xxx.xxx.xxx', 'xxx.xxx.xxx.xxx', ]; // クライアントIPが、アクセス許可するIPに含まれていればtrueを返す var isPermittedIp = IP_WHITE_LIST.includes(clientIP); if (isPermittedIp) { // trueの場合はオリジン側へリクエストを渡す return request; } else { var response = { statusCode: 403, statusDescription: 'Forbidden', } // falseの場合はViewer に対してレスポンスを返す return response; } }
Publishタブを選択し、先ほど保存した関数をLiveステージにコピーし公開するためにPublishボタンをクリックします。
Associateタブを選択し、関連付けたいCloudFrontのDistribution、Event Type、Cache behaviorを選択し、Add associationボタンをクリックします。
上記が成功すれば、画面下部に関連付けたCloudFrontが表示されます。
Functions画面に戻り、StatusがDeployed
になれば完了です。
3. 結果確認
許可したIPアドレスからアクセスした場合は、ブラウザにWebコンテンツが表示されます。
今回はシンプルにtest
とだけ表示されるHTMLを作成しました。
一方、許可していないIPアドレスからアクセスした場合は、HTTP ERROR 403
の画面が表示されました。
まとめ
既にCloudFrontの環境がある場合は、AWSマネージメントコンソールから簡単にIP制限を設定することができました。
CloudFront Functionsの1ヶ月のリクエスト料金は1,000,000 件あたり 0.10 USDです。
リーズナブルな価格で実装可能なため、ちょっとしたIP制限が必要な場合に手軽に利用できそうですね。
この記事が、どなたかのお役に立てば幸いです。それでは!